const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  // 打包模式
  mode: "development",

  // 入口配置
  //    chunk
  entry: "./src/index.js",

  // 出口配置
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
    // 是否清空构建目录
    clean: true,
  },

  // module.rules 配置 loader 规则
  module: {
    rules: [
      {
        test: /\.css$/,
        // use: ["style-loader", "css-loader"],
        // 配置 MiniCssExtractPlugin
        use: [MiniCssExtractPlugin.loader, "css-loader"],
      },
    ],
  },

  // 插件配置
  plugins: [
    new HtmlWebpackPlugin({
      // 让script标签插入到 body 下
      inject: "body",
      // 指定一个生成html的模板页面
      template: "./public/index.html",
    }),
    new CopyWebpackPlugin({
      patterns: [
        {
          // 指定要拷贝的文件或目录
          from: path.resolve(__dirname, "./public"),
          globOptions: {
            // 配置要排除的文件集合
            ignore: ["**/*.html"],
          },
        },
      ],
    }),
    new MiniCssExtractPlugin(),
  ],

  /**
   * 配置外部扩展
   * 作用，当源码中有引入对应key的包时，将不会打包到出口代码中，而是在运行时使用外部的配置
   * jquery 1m
   * 代码    1m
   *      => 2m
   *      => 1m
   *
   * vue 也是可以配置成 外部扩展的，但是没有必要。一些知名的包都做了tree shaking
   *  vue cdn 1m
   *  代码     1m
   *        2m
   */
  externals: {
    // key - 源码中 import 引入的包名，比如 jquery
    // value - 外部引入的文件提供的全局变量。比如 jQuery
    jquery: "jQuery",
  },

  // 本地开发
  devServer: {
    // 端口号
    port: 9090,
    // 是否自动打开浏览器
    open: true,
  },
};
